package com.ruoyi.system.service.impl;

import org.springframework.stereotype.Service;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysUserOnline;
import com.ruoyi.system.service.ISysUserOnlineService;

/**
 * 在线用户 服务层处理
 *
 * @author ruoyi
 */
@Service
public class SysUserOnlineServiceImpl implements ISysUserOnlineService {
    /**
     * 通过登录地址查询在线用户信息。
     * 如果传入的IP地址与用户的登录IP一致，则返回该用户对应的在线用户信息。
     *
     * @param ipaddr 登录地址（IP）
     * @param user   当前登录用户信息
     * @return 匹配的在线用户信息，若不匹配则返回null
     */
    @Override
    public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user) {
        // 判断给定的IP是否和当前用户登录IP相同
        if (StringUtils.equals(ipaddr, user.getIpaddr())) {
            return loginUserToUserOnline(user);
        }
        return null;
    }

    /**
     * 通过用户名查询在线用户信息。
     * 如果传入的用户名与当前用户的用户名一致，则返回该用户对应的在线用户信息。
     *
     * @param userName 用户名
     * @param user     当前登录用户信息
     * @return 匹配的在线用户信息，若不匹配则返回null
     */
    @Override
    public SysUserOnline selectOnlineByUserName(String userName, LoginUser user) {
        // 判断给定的用户名是否和当前用户名称相同
        if (StringUtils.equals(userName, user.getUsername())) {
            return loginUserToUserOnline(user);
        }
        return null;
    }

    /**
     * 同时根据登录地址和用户名查询在线用户信息。
     * 只有当两个条件都满足时才返回对应的在线用户信息。
     *
     * @param ipaddr   登录地址（IP）
     * @param userName 用户名
     * @param user     当前登录用户信息
     * @return 匹配的在线用户信息，若不匹配则返回null
     */
    @Override
    public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user) {
        // 判断IP地址和用户名是否同时匹配当前用户的信息
        if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) {
            return loginUserToUserOnline(user);
        }
        return null;
    }

    /**
     * 将登录用户对象转换为在线用户对象，并填充相关属性。
     * 若用户或其关联部门为空，则直接返回null。
     *
     * @param user 登录用户信息
     * @return 转换后的在线用户信息对象，可能为null
     */
    @Override
    public SysUserOnline loginUserToUserOnline(LoginUser user) {
        // 检查用户及其所属用户实体是否存在
        if (StringUtils.isNull(user) || StringUtils.isNull(user.getUser())) {
            return null;
        }

        // 创建并初始化在线用户对象
        SysUserOnline sysUserOnline = new SysUserOnline();
        sysUserOnline.setTokenId(user.getToken());
        sysUserOnline.setUserName(user.getUsername());
        sysUserOnline.setIpaddr(user.getIpaddr());
        sysUserOnline.setLoginLocation(user.getLoginLocation());
        sysUserOnline.setBrowser(user.getBrowser());
        sysUserOnline.setOs(user.getOs());
        sysUserOnline.setLoginTime(user.getLoginTime());

        // 填充部门名称（如果存在）
        if (StringUtils.isNotNull(user.getUser().getDept())) {
            sysUserOnline.setDeptName(user.getUser().getDept().getDeptName());
        }

        return sysUserOnline;
    }
}
